/**
 * 数据初始化服务
 * 负责初始化应用所需的默认数据
 */
import { JSONDataService } from './JSONDataService';
import { User } from './entity/User';
import { Case as CaseEntity } from './entity/Case'; // 重命名以避免与JavaScript保留字冲突
import { Clue } from './entity/Clue';
import { Evidence } from './entity/Evidence';
import { Person } from './entity/Person';

export class DataInitializer {
  /**
   * 初始化默认数据
   */
  public static async initializeDefaultData(): Promise<void> {
    try {
      console.log('开始初始化默认数据...');
      
      // 初始化默认用户
      await this.initializeDefaultUser();
      // 初始化示例案件数据
      await this.initializeSampleCases();
      
      console.log('默认数据初始化成功');
    } catch (error) {
      console.error('默认数据初始化失败:', error);
      // 继续抛出错误以便上层捕获
      throw error;
    }
  }
  
  /**
   * 初始化默认用户
   */
  private static async initializeDefaultUser(): Promise<void> {
    try {
      console.log('检查默认用户...');
      
      // 检查是否已有用户
      const users = await JSONDataService.getAllUsers();
      
      if (!users) {
        console.warn('获取用户列表失败，跳过默认用户创建');
        return;
      }
      
      if (users.length === 0) {
        console.log('未发现现有用户，创建默认管理员...');
        
        const adminUser = new User({
          username: 'admin',
          password: '123456', // 在实际应用中应该加密存储
          name: '管理员',
          avatar: '👤',
          email: 'admin@example.com',
          phone: '13800138000',
          role: 'admin',
          createdAt: new Date(),
          lastLoginAt: new Date()
        });
        
        await JSONDataService.createUser(adminUser);
        console.log('创建默认管理员用户成功');
      } else {
        console.log(`发现${users.length}个现有用户，跳过默认用户创建`);
      }
    } catch (error) {
      console.error('初始化默认用户失败:', error);
      // 继续抛出错误
      throw error;
    }
  }
  
  /**
   * 初始化示例案件数据
   */
  private static async initializeSampleCases(): Promise<void> {
    try {
      console.log('检查示例案件数据...');
      
      // 检查是否已有案件数据
      const cases = await JSONDataService.getAllCases();
      
      if (!cases) {
        console.warn('获取案件列表失败，跳过示例案件创建');
        return;
      }
      
      if (cases.length === 0) {
        console.log('未发现现有案件，创建示例案件数据...');
        
        // 使用事务式思维创建完整的案件数据
        try {
          // 创建示例案件1
          const case1 = new CaseEntity({
            title: '神秘失窃案',
            description: '某博物馆珍贵文物离奇失窃，现场未发现明显线索。',
            status: 'open',
            creatorId: 'admin',
            caseType: '盗窃案',
            location: '市中心博物馆',
            incidentTime: new Date('2024-01-15T20:00:00'),
            relatedPersonIds: [],
            evidenceIds: [],
            clueIds: []
          });
          
          await JSONDataService.createCase(case1);
          
          // 检查案件ID是否生成
          if (!case1.id) {
            throw new Error('案件创建失败，未生成案件ID');
          }
          
          // 创建示例线索1
          const clue1 = new Clue({
            title: '监控录像',
            description: '案发时间段监控出现短暂中断。',
            caseId: case1.id,
            discovererId: 'admin',
            discoveredAt: new Date('2024-01-16T09:30:00'),
            importance: 'high',
            status: 'pending',
            clueType: '监控证据',
            aiAnalysis: {
              relevanceScore: 0.85,
              analysisNotes: '监控中断时间与案发时间吻合，怀疑为有意为之',
              potentialLinks: []
            }
          });
          
          // 创建示例证据1
          const evidence1 = new Evidence({
            name: '手套纤维',
            description: '在展柜附近发现的可疑纤维。',
            caseId: case1.id,
            collectorId: 'admin',
            collectedAt: new Date('2024-01-16T10:00:00'),
            evidenceType: 'physical',
            status: 'collected',
            storagePath: '/evidence/fiber_sample_001',
            collectionLocation: '博物馆展柜附近',
            tags: ['纤维', '手套', '物证']
          });
          
          // 创建相关人员
          const suspect1 = new Person({
            name: '张三',
            roleType: 'suspect',
            age: 35,
            gender: 'male',
            description: '案发当晚曾在博物馆附近出现。',
            relatedCaseIds: [case1.id]
          });
          
          // 并行保存所有数据以提高性能
          await Promise.all([
            JSONDataService.createClue(clue1),
            JSONDataService.createEvidence(evidence1),
            JSONDataService.createPerson(suspect1)
          ]);
          
          // 更新案件的关联ID列表
          case1.addRelatedPerson(suspect1.id);
          case1.addEvidence(evidence1.id);
          case1.addClue(clue1.id);
          await JSONDataService.updateCase(case1);
          
          console.log('创建示例案件数据成功，包含完整的案件、线索、证据和相关人员信息');
        } catch (caseDataError) {
          console.error('创建示例案件数据时出错:', caseDataError);
          // 在实际应用中，这里可以考虑回滚已创建的数据
          throw caseDataError;
        }
      } else {
        console.log(`发现${cases.length}个现有案件，跳过示例案件创建`);
      }
    } catch (error) {
      console.error('初始化示例案件数据失败:', error);
      throw error;
    }
  }
}